/*
大学里的各种竞赛是层出不穷，多种多样。为了提高竞赛成绩，学院规定每个同学只能参加一个竞赛。
现有m种竞赛，有n个学生，每种竞赛参赛选手数是ai，且a1+a2+…+am=n。问共有多少种方案？
输入每种竞赛要选拔的选手人数，输出有多少种方案？学生人数恰好是所有竞赛要选拔的人数。数据保证0<n<=10000。如果方案数太大，对10007取余。
测试数据第一行表示测试实例的个数T(1<=T<=1000)。第2行到第T+1行每行表示一个测试实例。每个测试实例的第一个数是m，第2个到第m个数分别表示a1，a2，…,am。每个测试实例输出一行。
样例输入
2
2 3 2
1 5
输出
10
1


*/

#include <iostream>
#include <list>

using namespace std;

long long num[100001];
long long quickPow(long long a,long long b,long long p) ;

void init(long long p);

const int P = 10007;

int main(void) {

    int T = 0;
    long long mup,m,n,a;

    init(P);

    cin >> T;
    for (int i = 0; i < T; i++) {
      m = n = a = 0;
      mup = 1;
      cin >> m;
      for (int j = 0; j < m; j++) {
          cin >> a;
          mup = mup * num[a] % P;
          n = (n + a)% P;
      }
      //std::cout << n <<" "<< m << '\n';
      mup = num[n] * quickPow(mup,P-2,P) % P;
      std::cout << mup << '\n';

    }
  return 0;
}


void init(long long p)  //观察locas定理的函数可知，ni、mi由n、m对p取余得到，故程序中的用到的阶乘不会大于p！
{
  num[0] = 1;
  for (long long i = 1; i <= p; i++) {
    num[i] = num[i-1] * i % p;
  }

}





long long quickPow(long long a,long long b,long long p)  //快速幂,将a的b次方中的b化为二进制表示，快速求解
{
  long long temp,res;
  temp = a;  //temp = a的2的0次方
  res = 1;
  while(b)
  {
    if(b&1) res = res * temp % p;  //当b=b1b2b3b4...bn中的bi为1时，求幂才需要计入
    temp = temp * temp % p; // temp = a的x+2次方，x为上次的次方，如第一次时，此处变为a的2的1次方。
    b >>= 1; //b右移
  }
  return res;
}
